// cf-77c
// 题意：给定一颗n(<=10^5)节点的树，每个节点有ki(1<=ki<=10^5)个海狸，
//       现在你有一个海狸收割机，从某个指定节点开始。每次它可以往一个
//       海狸个数不为零的节点上移动，然后吃掉那个节点上一个海狸。
//       问最多可以吃掉多少海狸。
//
// 题解：很明显是个树形dp，但是当时一直卡在可能可以叶根反复走纠结。。
//       其实我们对每个节点i求出(xi, yi)，xi表示从这个节点开始往下并回来
//       最多可以吃多少海狸，yi表示最终回到i节点，i节点上还剩下多少海狸。
//       现在对于点v，我们先求出每个孩子的(xi, yi), 然后按xi排序，
//       先尽可能的选最大的，如果还有剩余，那么就和儿子节点中yi不为零的
//       反复走就行，直到自己或者儿子不够。
//
//       对于非根节点，初始xi=1, yi=ki-1，因为走到这个节点就已经吃了这个
//       节点的一个海狸，但是对于根节点初始为xi=0, yi=ki。
//
// run: $exec < input
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
#include <utility>

int const maxn = 100007;
int head[maxn], end_point[2 * maxn], next[2 * maxn];
int alloc = 2;
int a[maxn];
int n, start;

void add_edge(int u, int v)
{
	end_point[alloc] = v; next[alloc] = head[u]; head[u] = alloc++;
	end_point[alloc] = u; next[alloc] = head[v]; head[v] = alloc++;
}

using pair_type = std::pair<long long, int>;
pair_type dp(int s, int parent)
{
	std::vector<pair_type> v;
	long long sum = 0;
	for (int p = head[s]; p; p = next[p]) {
		int t = end_point[p];
		if (t == parent) continue;
		auto tmp = dp(t, s);
		v.push_back(tmp);
		sum += tmp.second;
	}
	std::sort(v.begin(), v.end(), std::greater<pair_type>());
	int n = v.size();
	pair_type ret(1, --a[s]);
	if (s == start) ret = std::make_pair(0, ++a[s]);
	for (int i = 0; i < std::min(n, a[s]); i++) {
		ret.first += v[i].first + 1;
		ret.second--;
	}
	if (ret.second) {
		auto tmp = std::min((long long)ret.second, sum);
		ret.first += tmp * 2;
		ret.second -= tmp;
	}
//	std::cerr << "s = " << s << "  " << ret.first << ' ' << ret.second << ' ' << a[s] << '\n';
	return ret;
}

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	for (int i = 1, x, y; i < n; i++) {
		std::cin >> x >> y;
		add_edge(x, y);
	}

	std::cin >> start;
	std::cout << dp(start, -1).first << '\n';
}

